#!/usr/bin/env python3
# -*- encoding: utf-8 -*-

'''
@file    :   app.py
@date    :   2020-06-27 16:07:42
@author  :   huenrong
'''

import sys
import os.path
from ctypes import *

if __name__ == '__main__':
    print("python call dll app start...")

    # 获取当前文件的目录
    current_path = os.path.dirname(sys.argv[0])
    # 指定动态库绝对路径
    dll_path = os.path.join(os.path.dirname(sys.argv[0]),
                            "python_test_dll.dll")

    # 判断当前目录下是否存在动态库文件
    ret = os.path.isfile(dll_path)
    # 不存在在指定动态库, 则提示, 并结束程序
    if (False == ret):
        print("不存在动态库 python_test_dll.dll")

        sys.exit()

    # 加载动态库
    # 这里建议使用绝对路径的方式加载动态库, 否则打包成exe后, 程序可能无法执行
    test_dll = windll.LoadLibrary(dll_path)

    # 字符串类型输入参数赋值
    # c_char_p定义的变量, 不可以传递给输出类型参数
    server_ip = c_char_p()
    server_ip.value = bytes("192.168.0.10", encoding="utf-8")

    # 字符串类型输出参数定义
    get_ip = create_string_buffer(32, "\0")

    # 调用函数
    ret = test_dll.get_server_info(get_ip, server_ip.value)
    if (0 == ret):
        # 获取字符串类型输出参数的值
        print("get ip: ", get_ip.value)

    #
    src_array_len = 8

    # 字符数组输入参数初始化和赋值可以采用三种方式
    # 方式1: 初始化并赋值
    # src_array = (c_char * 8)(*[0x11, 0x22, 0x33, 0x44,
    #                            0xAA, 0xBB, 0xCC, 0xDD])

    # 方式2: 初始化并赋值
    # array_type = (c_char * 8)
    # src_array = array_type(0x11, 0x22, 0x33, 0x44, 0xAA, 0xBB, 0xCC, 0xDD)

    # 方式3_步骤1: 初始化
    array_type = (c_char * 8)
    src_array = array_type()
    # 方式3_步骤2: 赋值
    for i in range(src_array_len):
        src_array[i] = i + 1

    # 传递指针(通过引用传递参数), 函数内部可能会改变该参数的值
    dst_array_len = c_char()

    # 字符数组输出参数定义
    dst_array = create_string_buffer(32, "\0")

    # 打印输入数据
    print("src array[len = %d]: [" % (src_array_len), end='')
    for i in range(src_array_len):
        print("0x%02X " % (int.from_bytes(src_array[i], 'big')), end='')
    print("]")

    # 调用函数
    # dst_array_len是通过引用传递参数, 需要使用byref
    ret = test_dll.array_reverse_copy(dst_array, byref(dst_array_len),
                                      src_array, src_array_len)

    # 打印输出数据
    if (0 == ret):
        print("dst array[len = %d]: [" % int.from_bytes(dst_array_len, 'big'),
              end='')
        for i in range(int.from_bytes(dst_array_len, 'big')):
            print("0x%02X " % (int.from_bytes(dst_array[i], 'big')), end='')
        print("]")
